home *** CD-ROM | disk | FTP | other *** search
- #include <dos.h>
- #include <conio.h>
- #include "event.h"
- #include "mouse2.h"
-
- typedef void interrupt (far * interruptptr)(...);
-
- extern EventDriver * eventdriverp;
- extern int get_key();
- /*
- mousestatus mousegetstatus()
- { mousestatus m;
- m.buttonstate=0;
- m.x=m.y=0;
- if(eventdriverp->mouse_present) m= mouseGetStatus();
- return m;}
- /*/
-
- ////////////////////////
-
- int key2event (unsigned bioskeycode);
-
-
- unsigned get_shift_keys()
- {
- return * (unsigned far *) MK_FP(0x40,0x17);
- }
-
- inline unsigned press(unsigned New,unsigned Old)
- { return New && (! Old);}
-
- inline unsigned release(unsigned New,unsigned Old)
- { return Old && (! New);}
-
-
-
-
-
-
- #define test_mk(button,presscode,releasecode) \
- if (press(news.buttonstate & button,olds.buttonstate & button))\
- difference|=presscode;\
- if (release(news.buttonstate & button,olds.buttonstate & button))\
- difference|=releasecode;
-
- static
- unsigned compare_mousestatus(const mousestatus& news,const mousestatus& olds)
- {
-
-
- unsigned difference=0;
- if(news.buttonstate!=olds.buttonstate)
- {
- test_mk(MOUSELEFT,mouseeventlow::MSLP ,mouseeventlow::MSLR )
- test_mk(MOUSERIGHT,mouseeventlow::MSRP ,mouseeventlow::MSRR )
- test_mk(MOUSECENTER,mouseeventlow::MSCP ,mouseeventlow::MSCR )
-
- }
- if(! ((news.where())==(olds.where()))) difference|=mouseeventlow::MSMOVE;
-
- int DoubleCl=news.buttonstate & 0x700;
- if( DoubleCl != (olds.buttonstate & 0x700) )
- difference |=DoubleCl;
-
- return difference;
- }
- #undef test_mk
- int keyboard101()
- {
- return (( * (char far *) MK_FP(0x40,0x96) ) & 0x10) != 0 ;
- }
-
-
-
- static
- shiftkeychangetype compare_shiftstatus(unsigned new_shift,char new_del,
- unsigned old_shift,char old_del)
- { enum {MASK=0xf3ff};
- static unsigned long odd_bits[] = {
- 0x00000001,0x00000004,0x00000010,0x00000040,
- 0x00000100,0x00000400,0x00001000,0x00004000,
- 0x00010000,0x00040000,0x00100000,0x00400000,
- 0x01000000,0x04000000,0x10000000,0x40000000};
-
-
- static unsigned long even_bits[]= {
- 0x00000002,0x00000008,0x00000020,0x00000080,
- 0x00000200,0x00000800,0x00002000,0x00008000,
- 0x00020000,0x00080000,0x00200000,0x00800000,
- 0x02000000,0x08000000,0x20000000,0x80000000 };
-
-
- new_shift &= MASK;
- old_shift &= MASK;
- unsigned bit; int i; unsigned long res;
- for(bit=1,i=0,res=0;i<16;i++,bit<<=1)
- {
- if(bit & new_shift) res|=odd_bits[i];
- if(bit & old_shift) res|=even_bits[i];
-
- }
- unsigned long mask;
- for(mask=0x3;mask!=0l;mask<<=2)
- if( (res & mask)==mask ) res^=mask;
-
- if(new_del && !old_del) res|=KCDelDn;
- if(! new_del && old_del) res|=KCDelUp;
-
- if(keyboard101())
- {
-
- if(! ( (KCltCtrlDn | KCltCtrlUp) & res) )
- { if((KCCtrlDn | KCCtrlUp)&res) res|=KCrtCtrl;}
-
- if(! ( (KCltAltDn | KCltAltUp) & res) )
- { if((KCAltDn |KCAltUp)&res)res|=KCrtAlt;}
-
- }
-
- return res;
- }
-
-
-
- event readevent(int mask)
- { int k;
- event result;
- result.what=NOEVENT;
- result.kbstatus=get_shift_keys();
- result.msstatus=mouseGetStatus2();
- result.Delpressed=EventDriver::Delispressed;
-
- if (! result.what && mask & SHIFTKEYEVENT)
- {
- shiftkeychangetype shiftchange;
- shiftchange=compare_shiftstatus(result.kbstatus ,result.Delpressed,
- EventDriver::oldkbstatus,EventDriver::olddelpressed);
- if(shiftchange)
- {
- result.kbchange=shiftchange;
- result.what=SHIFTKEYEVENT;
- }
- }
-
- if(!result.what && mask & KEYEVENT)
- {
- k=get_key();
- if (k!=EVENT_NO)
- { result.what=KEYEVENT; result.key= k;}
- }
-
- if (! result.what && mask & MOUSEEVENT)
- {
- unsigned mousechange=
- compare_mousestatus(result.msstatus,EventDriver::oldmsstatus);
- if (mousechange)
- {
- result.mousechange=mousechange;
- result.what=MOUSEEVENT;
- }
- }
-
- EventDriver::oldkbstatus=result.kbstatus;
- EventDriver::oldmsstatus=result.msstatus;
- EventDriver::olddelpressed=result.Delpressed;
-
- return result;
- }
-
- //**********************************************
-
- int eventavail(int mask,int mousemask)
- {
- if(mask & KEYEVENT) if(kbhit()) return 1;
- if(mask & MOUSEEVENT)
- { mousestatus mstatus=mouseGetStatus2();
- unsigned change=
- compare_mousestatus(mstatus,EventDriver::oldmsstatus)
- & mousemask;
- //!!!!
- if(!change) EventDriver::oldmsstatus=mstatus; // "eat up" event
-
- if(change) return 1;
- }
-
- if(mask & SHIFTKEYEVENT)
- {
- unsigned kbstatus=get_shift_keys();
- int Delpressed=EventDriver::Delispressed;
- shiftkeychangetype shiftchange;
- shiftchange=compare_shiftstatus(kbstatus ,Delpressed,
- EventDriver::oldkbstatus,EventDriver::olddelpressed);
- //!!!!
-
- if(shiftchange!=0)return 1;
- }
- return 0;
- }
-
- event getevent(int mask,int mousemask)
- { event evt;
-
- do{
- do{
- while(!eventavail(mask,mousemask));
-
- evt=readevent(mask);
-
- }
- while(!evt);
- if( evt.what!=MOUSEEVENT ) return evt;
- if (evt.mousechange & mousemask) return evt;
- } while(1);
- }
-
- /*
-
- event getevent(int mask,int mousemask)
- { event evt;
-
- thebeginning:
- do{
- evt=readevent(mask);
- } while(! evt);
-
- if( evt.what!=MOUSEEVENT ) return evt;
- if (evt.mousechange & mousemask) return evt;
- goto thebeginning; // I'm soo-o bad
- }
-
- */
- // Event Driver Static Vars
-
- void far * EventDriver::oldkbhandler;
- unsigned EventDriver::oldkbstatus=0;
- mousestatus EventDriver::oldmsstatus={0,0,0};
- volatile char EventDriver::Delispressed=0;
- unsigned char EventDriver::break_code=0;
- char EventDriver::olddelpressed=0;
- static EventDriver * theEventDriverp;
- static void start_() { theEventDriverp=new EventDriver;}
- static void exit_() {delete theEventDriverp;}
- #pragma startup start_ 90
- #pragma exit exit_ 90
- EventDriver::EventDriver()
- {
- oldkbhandler=getvect(0x9);
- setvect(0x9,(interruptptr)EventDriver::kbhandler);
- oldkbstatus=get_shift_keys();
- oldmsstatus=mouseGetStatus2();
- olddelpressed=Delispressed;
- }
-
- #define DEL_SCAN 0x53
- void far interrupt EventDriver::kbhandler()
- { typedef void (far * farfunc)();
-
- unsigned char scan=inportb(0x60);
- scan|=break_code;
- break_code= scan==0xf0 ? 0x80 : 0;
- if ( scan==DEL_SCAN ) Delispressed=1;
- if ( scan==(DEL_SCAN |0x80)) Delispressed=0;
-
- asm pushf;
- (farfunc(oldkbhandler))();
- }
-
-
-
- EventDriver::~EventDriver()
- {
- setvect(0x9,(interruptptr)oldkbhandler);
- }
-
-
-
-
-
-
-
-
-